//
//  QQGroupViewController.m
//  UITableViewDemo
//
//  Created by LZXuan on 15-5-18.
//  Copyright (c) 2015年 轩哥. All rights reserved.
//

#import "QQGroupViewController.h"
#import "UserModel.h"
#define kScreenSize [UIScreen mainScreen].bounds.size

@interface QQGroupViewController () <UITableViewDataSource,UITableViewDelegate>
{
    //表格视图
    UITableView *_tableView;
    //数据源数组
    NSMutableArray *_dataArr;
    
    //搜索结果控制器
    UISearchDisplayController *_display;
    //搜索结果数据源
    NSMutableArray *_searchResultsArr;
    
    //记录每个分区 的展开状态 0表示关闭 1表示展开状态
    int _sectionStatus[26];
}
@property (nonatomic,retain) UITableView *tableView;


@end

@implementation QQGroupViewController

- (void)dealloc {
    [_searchResultsArr release];
    [_display release];
    [_dataArr release];
    self.tableView = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [self creatTableView];
    
    [self dataInit];
}
#pragma mark - 数据
- (void)dataInit {
    
    _searchResultsArr = [[NSMutableArray alloc] init];
    
    _dataArr = [[NSMutableArray alloc] init];
    
    //创建 26 个一维 数组 把26个数组 放入_dataArr指向的对象
    //每个区分对应一个一维数组
    //每个cell 的数据 是一个整体（学生信息），这个时候我们应该 把这个学生信息封装一个类 (数据模型类) 每个cell 上面的数据 就是一个数据模型对象
    //这时我们就应该 把数据模型对象地址放入对应26个一维数组中
    
    for (NSInteger i = 0; i < 26; i++) {
        //一维数组
        NSMutableArray *arr = [[NSMutableArray alloc] init];
        for (NSInteger j = 0; j < 10 ; j++) {
            //一维数组的内容 应该是10个UserModel 对象
            UserModel *model = [[UserModel alloc] init];
            model.name = [NSString stringWithFormat:@"%C%ld",(unichar)('A'+i),j];
            model.phoneNumber = [NSString stringWithFormat:@"%u",arc4random()];
            model.sexStr = @"man";
            
            model.headName = [NSString stringWithFormat:@"%04u.jpg",arc4random()%24+33];
            //把模型对象放入数组中
            [arr addObject:model];
            [model release];
        }
        
        //把一维数组放入数据源
        [_dataArr addObject:arr];
        [arr release];
    }
    
    //有了数据之后 刷新表格
    [self.tableView reloadData];
}

#pragma mark - 创建表格
- (void)creatTableView {
    //取消导航条影响
    self.automaticallyAdjustsScrollViewInsets = NO;
    
    self.tableView = [[[UITableView alloc] initWithFrame:CGRectMake(0, 64, kScreenSize.width, kScreenSize.height-64) style:UITableViewStylePlain] autorelease];
    //设置代理和数据源
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
    //一旦把TableView粘贴到view 那么就可以立即执行协议的方法
    [self.view addSubview:self.tableView];
    
#pragma mark - 给TableView增加搜索
    
    //搜索条
    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 50)];
    
    //把UISearchBar粘贴到 TableView的头视图
    self.tableView.tableHeaderView = searchBar;
    
    //创建一个搜索结果显示控制器
    /*
     iOS8之前的类
     这个控制器内部有一个TableView 会把 搜索的结果放入到 内部的TableView上
     UISearchDisplayController 和 searchBar 搜索条进行关联
     
     把UISearchDisplayController  显示哪个视图控制器上方
     
     */
    _display = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    //设置 代理 (内部有TableView  会给内部的TableView的数据源和代理进行设置)
    _display.searchResultsDataSource =  self;
    _display.searchResultsDelegate = self;
    
    [searchBar release];
    //这样我们当前类 中有两个 TableView ，下面协议的方法要注意处理
}

#pragma mark - UITableView协议
//有多少分区
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if (tableView == self.tableView) {
        return _dataArr.count;
    }
    return 1;//搜索的TableView的 分区  1
}

//每个分区有多少行
//每次在向searchBar 输入字符的时候 UISearchDisplayController中TableView都会刷新表格
//换句话说 每次在向searchBar 输入字符的时候 下面的方法就会直接调用

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == self.tableView) {
        if (_sectionStatus[section]) { //1表示展开 0表示收起
            //表示展开
            return [_dataArr[section] count];
        }else{
            return 0;//0行
        }
        
        
    }
    
    //下面 就是UISearchDisplayController的TableView
    //每输入一个就应该立即匹配 字符串
    //每次再输入一个字符的时候 都要把之前的删除
    [_searchResultsArr removeAllObjects];
    
    //重新匹配 遍历_dataArr
    for (NSMutableArray *arr in _dataArr) {
        for (UserModel *model in arr) {
            UISearchBar *searchBar =(UISearchBar *) self.tableView.tableHeaderView;
            //查找 searchBar中输入的字符串 是否在名字中包含
            NSRange range = [model.name rangeOfString:searchBar.text];
            if (range.location != NSNotFound) {
                //找到
                [_searchResultsArr addObject:model];//放入搜索结果数组
            }
        }
    }
    
    return _searchResultsArr.count;//返回数组元素个数
}
//cell 显示之前 获取cell
//每次显示cell 都会调用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    if (tableView == self.tableView) {
        static NSString *cellId = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
        if (!cell) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId] autorelease];
        }
        //获取 数据源中数据模型对象
        UserModel *model = _dataArr[indexPath.section][indexPath.row];
        //填充cell  把数据模型的内容显示到cell 上
        
        cell.textLabel.text = model.name;
        cell.detailTextLabel.text = model.phoneNumber;
        cell.imageView.image = [UIImage imageNamed:model.headName];
        return cell;
    }
    
    //下面 对searchDisplay 的TableView操作
    
    static NSString *disPlayCellId = @"DisPlayCell";
    UITableViewCell *disCell = [tableView dequeueReusableCellWithIdentifier:disPlayCellId];
    if (disCell == nil) {
        disCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:disPlayCellId] autorelease];
    }
    //填充cell
    UserModel *model = _searchResultsArr[indexPath.row];
    
    disCell.textLabel.text = model.name;
    disCell.imageView.image = [UIImage imageNamed:model.headName];
    
    return disCell;
}

#pragma mark - 分区索引
//协议方法
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    if (self.tableView != tableView) {
        return nil;
    }
    
    NSMutableArray * titleArr = [[NSMutableArray alloc] init];
    
    for (NSInteger i = 0; i < 26; i++) {
        //设置26个分区的索引
        [titleArr addObject:[NSString stringWithFormat:@"%C",(unichar)('A'+i)]];
    }
    [titleArr addObject:@"#"];
    //返回一个数组
    return [titleArr autorelease];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    NSLog(@"index:%ld title:%@",index,title);
    return index;//选中右侧索引之后 返回 指定分区的索引值
}

#pragma mark - QQ分组
#pragma mark 分区的头视图
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (self.tableView != tableView) {
        return nil;
    }
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 40)];
    view.backgroundColor = [UIColor lightGrayColor];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, view.bounds.size.width, 30);
    
    UIImage *image = [UIImage imageNamed:_sectionStatus[section]?@"unfold":@"fold"];
    
    [button  setImage:image forState:UIControlStateNormal];
    button.tag = 101+section;
    //改变button 图片内容的位置 (相对于原始位置)
    CGFloat left = 140;
    //left   (左边界 距离原来的 左边界)(左边界相对于原来的左边界在右侧正 在左侧就是负的)
    
    //right  (右边界 距离原来的 右边界)
    button.imageEdgeInsets = UIEdgeInsetsMake(0, -(left), 0, left);
    //button 标题位置改变
    button.titleEdgeInsets = UIEdgeInsetsMake(0, -(left), 0, left);
    
    [button setTitle:[NSString stringWithFormat:@"%C",(unichar)('A'+section)] forState:UIControlStateNormal];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    
    button.backgroundColor = [UIColor whiteColor];
    [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:button];
    
    return [view autorelease];
}
- (void)btnClick:(UIButton *)button {
    NSInteger section = button.tag - 101;
    //_sectionStatus[section]  ^= 1;
    //跟原来状态 取反
    _sectionStatus[section] = !_sectionStatus[section];
    
    UIImage *image = [UIImage imageNamed:_sectionStatus[section]?@"unfold":@"fold"];
    //修改图片
    [button setImage:image forState:UIControlStateNormal];
    
    //只刷新指定分区
    //重新走协议的方法--》判断 状态 如果是0 显示 0行 如果不是显示真实行数
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
}
//设置分区的高
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 40;
}



@end
